// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:build linux&&（ppc64 | | ppc64le）
// +build linux 
// +build ppc64 ppc64le 

package syscall

// /archonsorsr2捕捉到r2受到
// /runtime.GOARCH的尊重这一事实。系统调用约定通常是r1、r2，err:=
// Syscall（陷阱，…）。并非所有架构都在
// ABI中定义r2。参见“人工系统调用”。
const archHonorsR2 = false

const _SYS_setgroups = SYS_SETGROUPS

// sys Dup2（旧fd int，新fd int）（错误）
// sysnb EPOLLCEATE（大小int）（fd int，错误）
// sys EpollWait（epfd int，事件[]EPOLLENT，msec int）（n int，错误）
// sys Fstat（fd int，stat，stat*stat）（错误）
// sys fstatat（dirfd int，path string，stat*stat_t，flags int）（error error）=sys_NEWFSTATAT 
// sys Fstatfs（fd int，buf*Statfs_t）（error error）
// sysnb Getgid（）（gid int）
// sysnb Getrlimit（resource int，rlim*Rlimit）（error error）=SYS_ugetrimit 
// sysnb Getuid（）（uid int）
// sysnb inotifiyinit（）（fd int，error）
// sys Lchown（路径字符串，uid int，gid int）（error error）
// sys Listen（s int，n int）（error error）
// sys Lstat（路径字符串，stat*stat_t）（error error）
// sys Pause（）（error error）
// sys Pread（fd int，p[]字节，偏移量int64）（n int，error）=SYS_PREAD64 
// SYS Pwrite（fd int，p[]byte，offset int64）（n int，error error）=SYS_PWRITE64 
// SYS rename（olddirfd int，oldpath string，newdirfd int，newpath string）（error error）
// SYS Seek（fd int，offset int64，whence int）（off int64，error error error）=SYS（nfd int，r*FdSet，w*FdSet，e*FdSet，timeout*Timeval）（n int，error error）=SYS\u NEWSELECT 
// SYS sendfile（out int，infd int，offset*int64，count int）（writed int，error）
// SYS Setfsgid（gid int）（error error）
// SYS Setfsuid（uid int）（error）
// sysnb Setrlimit（资源int，rlim*Rlimit）（错误）
// sys Truncate（路径字符串，长度int64）（错误）
// sys Ustat（dev int，ubuf*Ustat_t）（错误）
// sys accept（s int，rsa*RawSockaddrAny，addrlen*_Socklen）（fd int，error）
// sys connect（s int，addr unsafe.Pointer，addrlen Socklen）（错误）
// sys connect（s int，addr unsafe.Pointer，addrlen Socklen）（错误）
// sysnb getgroups（n int，list*.\u Gid_t）（nn int，err err err error）
// sys setsockopt（s int，level int，name int，val unsafe.Pointer，vallen uintpttr）（错误）
// sysnb socket（domain int，typ int，proto int）（fd int，error）
// sysnb socketpair（domain int，typ int，proto int，fd*[2]int32）（错误）
// sysnb getsockname（fd int，rsa*RawSockaddrAny，addrlen*_Socklen）（错误）
// sys recvfrom（fd int，p[]字节，flags int，from*RawSockaddrAny，fromsocklen*)Socklen）（n int，错误）
// sys recvmsg（s int，msg*Msghdr，flags int）（n int，error）
// sys sendmsg（s int，msg*Msghdr，flags int）（n int，error）
// sys mmap（addr uintptpr，length uintptpr，prot，flags int，fd int，offset int64）（xaddr uintptr，err error）

// sys futimesat（dirfd int，path string，times*[2]Timeval）（error error）
// sysnb Gettimeofday（tv*Timeval）（error error）
// sys Utime（path string，buf*utimbuff）（error）
// sysutimes（路径字符串，times*[2]Timeval）（错误）

func setTimespec(sec, nsec int64) Timespec {
	return Timespec{Sec: sec, Nsec: nsec}
}

func setTimeval(sec, usec int64) Timeval {
	return Timeval{Sec: sec, Usec: usec}
}

func Pipe(p []int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe2(&pp, 0)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}

// sysnb pipe2（p*[2]\u C_int，flags int）（错误）

func Pipe2(p []int, flags int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe2(&pp, flags)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}

func (r *PtraceRegs) PC() uint64 { return r.Nip }

func (r *PtraceRegs) SetPC(pc uint64) { r.Nip = pc }

func (iov *Iovec) SetLen(length int) {
	iov.Len = uint64(length)
}

func (msghdr *Msghdr) SetControllen(length int) {
	msghdr.Controllen = uint64(length)
}

func (cmsg *Cmsghdr) SetLen(length int) {
	cmsg.Len = uint64(length)
}

func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)

// sys syncFileRange2（fd int，flags int，off int64，n int64）（错误）=sys SYNC_FILE_RANGE2 

func SyncFileRange(fd int, off int64, n int64, flags int) error {
	// SYNC_FILE_range和SYNC_FILE_RANGE2系统调用仅在参数顺序上不同。
	return syncFileRange2(fd, flags, off, n)
}
